#include <bits/stdc++.h>
using namespace std;
const int N=50050;
const double eps=1e-10;
struct Point{
    int x,y;
}pList[N];
int s[N],top;
int dcmp(double x){
    if(fabs(x)<eps){
        return 0;
    }
    else{
        return x<0?-1:1;
    }
}
//叉乘
int cross(Point a,Point b,Point c){
    return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
//距离
double dis(Point a,Point b){
    return sqrt((double)(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
//极角排序
bool cmp(Point a,Point b){
    int tmp=cross(pList[0],a,b);
    if(tmp>0){
        return true;
    }else if(tmp==0 && dcmp(dis(pList[0],a)-dis(pList[0],b))<=0){
        return true;
    }else{
        return false;
    }
}
void init(int n){
    scanf("%d%d",&pList[0].x,&pList[0].y);
    Point p0=Point{pList[0].x,pList[0].y};
    //找到纵坐标最小的点作为初始点p0
    int k=0;
    for(int i=1;i<n;i++){
        scanf("%d%d",&pList[i].x,&pList[i].y);
        if(pList[i].y<p0.y || (pList[i].y==p0.y && pList[i].x<p0.x)){
            p0=Point{pList[i].x,pList[i].y};
            k=i;
        }
    }
    //
    pList[k]=pList[0];
    pList[0]=p0;
    sort(pList+1,pList+n,cmp);
}
void graham(int n){
    top=1;
    s[0]=0;
    s[1]=1;
    for(int i=2;i<n;i++){
        while(top>0 && cross(pList[s[top-1]],pList[s[top]],pList[i])<=eps){
            top--;
        }
        s[++top]=i;
    }
}
double getArea(Point a,Point b,Point c){
    return (a.x*b.y+b.x*c.y+c.x*a.y-a.x*c.y-b.x*a.y-c.x*b.y)*1.0/2;
}
int main(void){
    int n;
    while(~scanf("%d",&n)){
        init(n);
        graham(n);
        // for(int i=0;i<=top;i++){
        //     printf("%d %d %d\n",s[i],pList[s[i]].x,pList[s[i]].y);
        // }
        double ans=0;
        for(int i=0;i<=top;i++){
            for(int j=i+1;j<=top;j++){
                for(int k=j+1;k<=top;k++){
                    ans=max(ans,getArea(pList[s[i]],pList[s[j]],pList[s[k]]));
                }
            }
        }
        printf("%.2lf\n",ans);
    }
    return 0;
}